package resman.model;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.hibernate.Session;

import resman.bean.ResumeBean;

@SuppressWarnings("serial")
public abstract class ActionServlet extends HttpServlet
{
	
	protected static final int ADD_OP = 1;
	protected static final int REMOVE_OP = 2;
	protected static final int LOGIN_OP = 3;
	protected static final int LOGOUT_OP = 4;
	
	/**
	 * Retorna um parâmetro vindo da requisição
	 * @param param Nome do parâmetro
	 * @param request Requisição
	 * @return Valor do parâmetro como uma string
	 */
	protected String getParameter(String param, HttpServletRequest request)
	{
		return request.getParameter(param);
	}
	
	/**
	 * Retorna um parâmetro inteiro vindo da requisição
	 * @param param Nome do parâmetro
	 * @param request Requisição
	 * @return Valor do parâmetro como um inteiro
	 */
	protected int getIntParameter(String param, HttpServletRequest request)
	{
		return Integer.parseInt(request.getParameter(param));
	}
	
	/**
	 * Retorna um parâmetro de operação vindo da requisição
	 * @param param Nome do parâmetro
	 * @param request Requisição
	 * @return Valor do parâmetro como uma operação
	 */
	protected int getOpParameter(String param, HttpServletRequest request)
	{
		String op = getParameter(param, request);
		
		if (op.equals("add"))
			return ADD_OP;
		else if (op.equals("remove"))
			return REMOVE_OP;
		else if (op.equals("login"))
			return LOGIN_OP;
		else if (op.equals("logout"))
			return LOGOUT_OP;
		else
			return -1;
	}
	
	/**
	 * Retorna o caminho completo para um arquivo
	 * @param file Nome do arquivo
	 * @param request Requisição
	 * @return Caminho completo para um arquivo
	 */
	protected String getPath(String file, HttpServletRequest request)
	{
		return request.getServletContext().getRealPath(file);
	}
	
	/**
	 * Despacha a requisição para uma outra página
	 * @param to Página a ser despachada a requisição
	 * @param request Requisição
	 * @param response Resposta
	 */
	protected void dispatchTo(String to, HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		request.getRequestDispatcher(to).forward(request, response);
	}
	
	/**
	 * Retorna a sessão HTTP corrente
	 * @param request Requisição
	 * @return Sessão HTTP corrente
	 */
	protected HttpSession getSession(HttpServletRequest request)
	{
		return request.getSession(true);
	}
	
	/**
	 * Retorna o currículo armazenado na sessão
	 * @param request Requisição
	 * @return Currículo armazenado na sessão
	 */
	protected ResumeBean getResume(HttpServletRequest request)
	{
		return (ResumeBean) getSession(request).getAttribute("resume");
	}
	
	/**
	 * Seta o currículo na sessão
	 * @param resume Currículo
	 * @param request Requisição
	 */
	protected void setResume(ResumeBean resume, HttpServletRequest request)
	{
		getSession(request).setAttribute("resume", resume);
	}
	
	/**
	 * Atualiza o currículo na memória
	 * @param resume Currículo
	 * @param session Sessão Hibernate
	 * @param request Requisição
	 */
	protected void refreshResume(ResumeBean resume, Session session, HttpServletRequest request)
	{
		resume = (ResumeBean) session.get(ResumeBean.class, resume.getResumeId());
		setResume(resume, request);
	}
	
	/**
	 * Seta um erro
	 * @param request Requisição
	 */
	protected void setError(HttpServletRequest request, String error)
	{
		getSession(request).setAttribute("error", error);
	}
	
	/**
	 * Limpa o erro
	 * @param request Requisição
	 */
	protected void clearError(HttpServletRequest request)
	{
		getSession(request).removeAttribute("error");
	}
	
	/**
	 * Fecha a sessão
	 * @param request Requisição
	 */
	protected void closeSession(HttpServletRequest request)
	{
		HttpSession session = getSession(request);
		session.removeAttribute("resume");
		session.removeAttribute("error");
		session.invalidate();
	}
	
	/**
	 * Realiza o processamento da requisição via GET
	 * @param request Requisição
	 * @param response Resposta
	 */
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException
	{
		process(request, response);
	}

	/**
	 * Realiza o processamento da requisição via POST
	 * @param request Requisição
	 * @param response Resposta
	 */
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException
	{
		process(request, response);
	}
	
	/**
	 * Realiza o processamento da requisição
	 * @param request Requisição
	 * @param response Resposta
	 */
	protected abstract void process(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException;
	
	
}
